import {ref, watchEffect} from 'vue';
import {defineStore} from 'pinia';
import {useSettingsStore} from './settings';
import {type RouteLocationNormalized} from 'vue-router';
import {getVisitedViews, setVisitedViews, getCachedViews, setCachedViews} from '@/utils/cache/local-storage';

export type TagView = Partial<RouteLocationNormalized>;

export const useTagsViewStore = defineStore('tags-view', () => {
    const {cacheTagsView} = useSettingsStore();
    const visitedViews = ref<TagView[]>(cacheTagsView ? getVisitedViews() : []);
    const cachedViews = ref<string[]>(cacheTagsView ? getCachedViews() : []);

    /** 缓存标签栏数据 */
    watchEffect(() => {
        setVisitedViews(visitedViews.value);
        setCachedViews(cachedViews.value);
    });

    //#region add
    const addVisitedView = (view: TagView) => {
        // 检查是否已经存在相同的 visitedView
        const index = visitedViews.value.findIndex((v) => v.path === view.path);
        if (index !== -1) {
            // 防止 query 参数丢失
            visitedViews.value[index].fullPath !== view.fullPath && (visitedViews.value[index] = {...view});
        } else {
            // 添加新的 visitedView
            visitedViews.value.push({...view});
        }
    };

    const addCachedView = (view: TagView) => {
        if (typeof view.name !== 'string') {
            return;
        }
        if (cachedViews.value.includes(view.name)) {
            return;
        }
        if (view.meta?.keepAlive) {
            cachedViews.value.push(view.name);
        }
    };
    //#endregion

    //#region del
    const delVisitedView = (view: TagView) => {
        const index = visitedViews.value.findIndex((v) => v.path === view.path);
        if (index !== -1) {
            visitedViews.value.splice(index, 1);
        }
    };

    const delCachedView = (view: TagView) => {
        if (typeof view.name !== 'string') {
            return;
        }
        const index = cachedViews.value.indexOf(view.name);
        if (index !== -1) {
            cachedViews.value.splice(index, 1);
        }
    };
    //#endregion

    //#region delOthers
    const delOthersVisitedViews = (view: TagView) => {
        visitedViews.value = visitedViews.value.filter((v) => {
            return v.meta?.affix || v.path === view.path;
        });
    };

    const delOthersCachedViews = (view: TagView) => {
        if (typeof view.name !== 'string') {
            return;
        }
        const index = cachedViews.value.indexOf(view.name);
        if (index !== -1) {
            cachedViews.value = cachedViews.value.slice(index, index + 1);
        } else {
            // 如果 index = -1, 没有缓存的 tags
            cachedViews.value = [];
        }
    };
    //#endregion

    //#region delAll
    const delAllVisitedViews = () => {
        // 保留固定的 tags
        visitedViews.value = visitedViews.value.filter((tag) => tag.meta?.affix);
    };

    const delAllCachedViews = () => {
        cachedViews.value = [];
    };
    //#endregion

    return {
        visitedViews,
        cachedViews,
        addVisitedView,
        addCachedView,
        delVisitedView,
        delCachedView,
        delOthersVisitedViews,
        delOthersCachedViews,
        delAllVisitedViews,
        delAllCachedViews
    };
});
